package cn.hongyu.jdk;

import org.junit.Test;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
/*基于JDK动态代理*/
public class TsetJDK {
    @Test
    public void testjdk1(){
        //创建目标对象
        final Target target=new Target();
        //获得增强对象
        Advice advice=new Advice();
        //返回值就是生成的动态代理对象
        TargetInterface target1  = (TargetInterface) Proxy.newProxyInstance(
                target.getClass().getClassLoader(), //目标对象类加载器
                target.getClass().getInterfaces(),//目标对象相同的接口字节码对象数组
                new InvocationHandler() {
                    //调用动态代理对象实际执行的都是invole方法
                    public Object invoke(Object o, Method method, Object[] objects) throws Throwable {
                        //前置增强
                        advice.before();
                        //执行目标方法（下面invoke代表反射的invoke）
                        // 参数一代表执行谁的 参数二是实际参数
                        Object invoke = method.invoke(target, objects);
                        //后置增强
                        advice.after();
                        return invoke;
                    }
                });
        //调用动他代理对象的方法
        target1.save();
    }
}
